package main

import (
	"fmt"
	"reflect"
)

type temprature int

func main() {
	//var temprature interface{} = temprature(5)
	//fmt.Printf("temprature is %d", temprature.(int))
	var temp interface{} = temprature(5)
	fmt.Printf("temprature is %d\n", temp.(temprature))
	itype := reflect.TypeOf(temp)
	ivalue := reflect.ValueOf(temp)
	fmt.Printf("%v: %v", itype, ivalue)
	// 通过 TypeOf 与 ValueOf 方法，我们已经取到了接口变量的类型和实际的值
	//
}

/*

	因为 golang 中指针类型与指向区域的数据类型必须一致且不能变更，这为抽象功能的实现带来了太大的局限，
	于是 golang 中提供了 unsafe 包，提供了对指针的增强功能，unsafe.Pointer类似于C中的void*，
	任何类型的指针都可以转换为unsafe.Pointer 类型，unsafe.Pointer 类型也可以转换为任何指针类型。
	从上面的代码中，我们看到，在 golang 中，不具有方法的接口类型与具有方法的接口类型是分别通过 eface 与 iface 两种类型实现的。

	反射的实现 — reflect 包
	在 golang 中，reflect 包实现了反射机制，它定义了两个重要的类型：Type 和 Value，分别用来获取接口类型变量的实际类型与值。
	获取他们的方法就是 TypeOf 和 ValueOf 方法。

	TypeOf 的实现通过 unsafe.Pointer 进行指针类型的强制转换，从而通过返回的实例中获取到内存中数据的实际类型字段。

	ValueOf 的实现相较于 TypeOf 的实现显得略为复杂一些。
	在 unpackEface 函数中，同样通过 unsafe.Pointer 将传入参数转换为了 emptyInterface 类型，
	从而可以获取到传入参数的类型字段与指向实际数据的指针，最终封装为 Value 类型值返回：

*/
